Maximum Subarray 连续子数组的最大和
题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5
,和最大的子数组为3, 10, -4, 7, 2
,
因此输出为该子数组的和18。
leetcode-53 Maximum Subarray 连续子数组的最大和
《剑指Offer》题31
思路
一个数值加上一个负值,所得到的结果自然小于其本身。 使用一个curSum变量来记录当前所考察的子数组的当前和,curMax变量来记录当前所得到的最大值;
遍历数组,若curSum为负值,则加上当前值num[i],所得到的和一定小于num[i],则直接将前面的子数组舍弃,取当前值为下一个继续考察的子数组的起点,则curSum=nums[i];
若curSum为正值,可想而知,直接加上num[i]会得到更大值;
比较当前获得的curSum与之前获得的最大值,每一步都得到当前的最大值,则最终获得的最大值即为curMax所记录的值;
LeetCode代码:
class Solution {
public int maxSubArray(int[] nums) {
if(nums == null || nums.length== 0){
return 0;
}
int curMax = nums[0];
int curSum = nums[0];
for(int i=1;i<nums.length;i++){
if(curSum < 0){//当前子序列结束
curSum = 0;
}
curSum+=nums[i];
if(curSum > curMax){
curMax = curSum;
}
}
return curMax;
}
}